'use server'; import './style.scss'; import View from './view'; import { notFound, forbidden, redirect } from 'next/navigation'; import { BoardLayout, BoardSort, PostSearchType } from '@/constants/forum'; import { BoardPostsRequest } from '@/types/request/forum/board'; import { checkAuthServer } from '@/lib/api/auth'; import { fetchBoard, fetchBoardPosts } from '@/lib/api/forum/board'; import { throwError, checkPermission } from '@/lib/utils/server'; import PermissionDenied from '../_component/PermissionDenied'; type Props = { params: Promise<{ code: string; }>; searchParams: Promise<{ page: number; perPage: number; prefix?: number; sort?: BoardSort; search: PostSearchType; keyword?: string; }>; } export default async function Board({ params, searchParams }: Props) { const { code } = await params; if (!code) { return notFound(); } const query = await searchParams; // 게시판 조회 const board = await fetchBoard(code); if (!board || !board.data) { return notFound(); } if (!board.data.isActive) { return forbidden(); } if (!board.data.boardMeta) { throw new Error('게시판 속성을 찾을 수 없습니다.'); } // 1:1 게시판은 로그인한 사용자만 접근 가능 if (board.data.boardMeta.list.layout === BoardLayout.QnA && !await checkAuthServer()) { redirect('/login'); } // 게시판 접근 권한 확인 if (!await checkPermission(board.data.boardMeta.permission.boardAccess, board.data.boardManager)) { return ; } query.page = Math.max(Number(query.page) || 1) as number; query.perPage = Math.max(Number(query.perPage) || (board.data.boardMeta.list.perPage || 10)) as number; query.prefix = (Number(query.prefix) || null) as number|undefined; query.sort = (Number(query.sort) || board.data.boardMeta.list.sort) as BoardSort|undefined; query.search = (Number(query.search) || PostSearchType.Subject) as PostSearchType; query.keyword = (query.keyword || '') as string|undefined; // 게시글 조회 const boardPosts = await fetchBoardPosts({ boardID: board.data.id as number, boardCode: board.data.code as string, page: query.page as number, perPage: query.perPage as number, boardPrefixID: query.prefix as number|null|undefined, sort: query.sort as BoardSort|null|undefined, search: query.search as PostSearchType, keyword: query.keyword as string|null|undefined } as BoardPostsRequest); if (!boardPosts.success) { throwError(boardPosts); } return ( ); }